package it.unisa.unibox.junit.storage;

import it.unisa.unibox.Storage.DBAutenticazione;
import it.unisa.unibox.beans.Account;
import it.unisa.unibox.beans.Amministratore;
import it.unisa.unibox.beans.ResponsabileValutazione;
import it.unisa.unibox.beans.Ricercatore;

import java.sql.SQLException;

import junit.framework.TestCase;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class DBAutenticazioneTest extends TestCase {

	private DBAutenticazione db;
	private Ricercatore ricercatore;
	private Amministratore amministratore;
	private ResponsabileValutazione responsabile;
	private Account account;

	@Override
	@Before
	public void setUp() throws Exception {
		super.setUp();
		db = DBAutenticazione.getInstance();
	}

	@Override
	@After
	public void tearDown() throws Exception {
		super.tearDown();
		System.gc();
	}

	@Test
	public void testLoginFail1() {
		try {
			account = db.login("", "pippos");
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNull(account);
	}

	@Test
	public void testLoginFail2() {
		try {
			account = db.login("pippoP", "");
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNull(account);
	}

	@Test
	public void testLoginFail3() {
		try {
			account = db.login("pippoP", "passwordSbagliataASDASD");
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNull(account);
	}

	@Test
	public void testLoginFail4() {
		try {
			account = db.login("as@fa?^\"", "44rfdsq2");
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNull(account);
	}

	@Test
	public void testLoginFail5() {
		try {
			account = db.login("", "");
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNull(account);
	}

	@Test
	public void testLoginSuccessRicercatore() {
		try {
			account = db.login("pippoP", "pippos");
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(account);
		assertEquals(2,account.getId());
		assertEquals(1,account.getTipologia());
		try {
			ricercatore = db.retrieveRicercatore(account);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(ricercatore);
		assertTrue(ricercatore.getId() > 0);
		assertEquals("Filippo", ricercatore.getNome());
		assertEquals("Ponte", ricercatore.getCognome());
		assertEquals("PNEFLP90C15H703X", ricercatore.getCodFisc());
		assertEquals("M", ricercatore.getSesso());
		assertEquals("pippop@unisa.it", ricercatore.getEmail());
		assertEquals("Salerno", ricercatore.getCittaNascita());
		assertEquals("1970-10-10", ricercatore.getDataNascita());
		assertEquals("1999-10-15", ricercatore.getDataInizioServizio());
		assertNotNull(ricercatore.getDipartimento());
		assertEquals(1, ricercatore.getDipartimento().getId());
		assertNotNull(ricercatore.getAreaScientifica());
		assertEquals(6, ricercatore.getAreaScientifica().getId());
		assertEquals(1512100267, ricercatore.getMatricola());
		assertEquals(1, ricercatore.getRuolo());
	}

	@Test
	public void testLoginSuccessAmministratore() {
		try {
			account = db.login("admintwo", "giorgio");
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(account);
		assertEquals(5,account.getId());
		assertEquals(5,account.getTipologia());
		try {
			amministratore = db.retrieveAmministratore(account);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(amministratore);
		assertEquals("Giorgio", amministratore.getNome());
		assertEquals("Balsamo", amministratore.getCognome());
	}

	@Test
	public void testLoginSuccessResponsabile() {
		try {
			account = db.login("accFive", "numberFive");
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(account);
		assertEquals(16,account.getId());
		assertEquals(4,account.getTipologia());
		try {
			responsabile = db.retrieveResponsabileValutazione(account);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(responsabile);
		assertEquals("Mirko", responsabile.getNome());
		assertEquals("Sessa", responsabile.getCognome());
	}
}
